属性查询 Sample详情

最后更新时间:2020年12月8日

属性条件查询,即为属性关键字查询,根据选择图层、字段、关键字对图层要素进行查询并显示查询结果。通过结果要素可获取其空间信息与属性信息,根据应用需求解析结果,并选择适合的方式展现。属性查询与空间查询整体思路一致,大部分步骤也相同,主要区别在于属性查询不需要设置空间范围条件,需设置属性过滤条件。

1

准备查询图层数据

与空间查询类似,首先需准备待查询的图层数据。

        //获取地图对象
        Map map = mapView.getMap();
        //获取查询图层对象(指定点图层)
        for (int i = 0; i < map.getLayerCount(); i++) {
            mapLayer = map.getLayer(i);
            if (mapLayer.getName().equals("四级点")) {
                //获取矢量图层
                vectorLayer = (VectorLayer) mapLayer;
                break;
            }
        }

2

创建查询对象并设置参数

创建查询条件对象(QueryDef),为其设置构造的查询属性条件等参数。

        //属性查询条件(根据想要查询的字段、关键字、属性条件,构造查询语句,保存为字符串)
        if (condition != "") {
            condition = "Name LIKE '%公园%'";
        }
        //初始化查询对象(矢量图层)
        FeatureQuery featureQuery = new FeatureQuery(vectorLayer);
        //设置查询条件
        QueryDef queryDef = new QueryDef();
        queryDef.setPagination(0, 10000);//设置分页查询
        queryDef.setFilter(condition);//设置属性条件
        queryDef.setWithSpatial(true);//是否设置缓存空间图形记录
        queryDef.setSubFields("*");//属性相关选项设置,设置查询结果字段集 字段名支持以空格或者'\t'隔开,如a, b , c
        featureQuery.setQueryDef(queryDef);//设置查询条件对象

3

查询

执行查询操作,并获取查询结果。

        //进行查询
        FeaturePagedResult result = featureQuery.query();
        //查询结果要素个数
        mFeatureCount = result.getTotalFeatureCount();
        if (mFeatureCount != 0) {
            Toast.makeText(this, "查询结果个数为:" + mFeatureCount, Toast.LENGTH_SHORT).show();
            //自定义方法:以标注形式展示查询的位置点
            showResultFeatrue(result);
        } else {
            Toast.makeText(this, "查询不到符合条件的要素", Toast.LENGTH_SHORT).show();
        }

4

结果展示

解析查询返回的结果要素,可通过标注、列表等形式展示给用户。

   //自定义方法:获取结果中的要素及其属性、几何,以标注形式展示查询的位置点
   private void showResultFeatrue(FeaturePagedResult result) {
        //结果列表对象
        ListView attObj = (ListView) findViewById(R.id.result);
        //结果列表数组
        String[] fNameArr;
        //要素名称
        String featureName = "";
        //取第一页结果要素
        featureList = result.getPage(1);
        //结果列表数组大小
        fNameArr = new String[featureList.size()];
        //获取地图容器对象
        mapView = (MapView) findViewById(R.id.spatialquery_mapview);
        //遍历要素获取其属性信息与几何信息
        for (int i = 0; i < featureList.size(); i++) {
            // 获取要素
            Feature feature = featureList.get(i);
            // 获取要素属性
            java.util.Map attributes = new HashMap();

            // 获取要素字段结构
            Fields fields = result.getFields();
            // 获取字段数目
            short fieldCount = fields.getFieldCount();
            for (short j = 0; j < fieldCount; j++) {
                Field field = fields.getField(j);
                // 获取字段名称
                String strFieldName = field.getFieldName();

                // 获取对应字段的值
                attributes = feature.getAttributes();

                // 显示获取到的属性信息
                if (strFieldName.equals("Name")) {
                    //结果列表数组
                    fNameArr[i] = attributes.get(strFieldName);
                    //结果要素名称
                    featureName = attributes.get(strFieldName);
                }
            }
            //获取要素的几何信息(默认查询点要素)
            Geometry fGeometry = feature.getGeometry();
            GeometryType featureType = fGeometry.getType();
            if (featureType.equals(GeometryType.GeoPoint)) {
                //转换为点图形
                GeoPoint geoPoint = (GeoPoint) fGeometry;
                Dot3D point3D = geoPoint.get();
                point = new Dot(point3D.getX(), point3D.getY());
            } else if (featureType.equals(GeometryType.GeoMultiPoint)) {
                //转换为点图形
            	GeoMultiPoint geoPoints = (GeoMultiPoint) fGeometry;
                //获取点图形的几何点
                Dot3D point3D = geoPoints.get(0);
                point = new Dot(point3D.getX(), point3D.getY());
            }

            //在地图上添加标注
            addLabel(point, featureName);
            // 获取要素对应的图形
            //List graphics = feature.toGraphics(true);
            // 高亮显示查询的结果
            //mapView.getGraphicsOverlay().addGraphics(graphics);
        }
        //将结果列表数组包装成ArrayAdapter
        ArrayAdapter adapter = new ArrayAdapter(this, R.layout.array_item, fNameArr);
        //为ListView设置Adapter
        attObj.setAdapter(adapter);
        //刷新地图
        mapView.refresh();
    }

    /**
     * 添加标注
     *
     * @param dot
     */
    private void addLabel(Dot dot, String name) {
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.location);
        mapView = (MapView) findViewById(R.id.spatialquery_mapview);
        AnnotationsOverlay annotationsOverlay = mapView.getAnnotationsOverlay();
        Annotation annotation = new Annotation(name, name, dot, bmp);
        annotation.setCanShowAnnotationView(true);
        annotationsOverlay.addAnnotation(annotation);
    }

实现效果如下图所示:

属性查询.jpg